#if !defined(TESTCLASS_H)
#define TESTCLASS_H

template<class T>
void TemplateNonMemberFn(T)
{
}

struct Class
{
  template<class T>
  static void TemplateMemberFn(T);

  template<class T>
  static void TemplateInlineMemberFn(T)
  {
  }
};

template<class T>
void Class::TemplateMemberFn(T)
{
}

template<class T>
struct TemplateClass
{
  static void MemberFn(T);

  static void InlineMemberFn(T)
  {
  }
  
  template<class U>
  static void TemplateMemberFn(U);

  template<class U>
  static void TemplateInlineMemberFn(U)
  {
  }
};

template<class T>
void TemplateClass<T>::MemberFn(T)
{
}

template<class T>
template<class U>
void TemplateClass<T>::TemplateMemberFn(U)
{
}

typedef void (*IntFunPtr)(int);

IntFunPtr CreateTemplateNonMemberFnA();
IntFunPtr CreateClassTemplateMemberFnA();
IntFunPtr CreateClassTemplateInlineMemberFnA();
IntFunPtr CreateTemplateClassMemberFnA();
IntFunPtr CreateTemplateClassInlineMemberFnA();
IntFunPtr CreateTemplateClassTemplateMemberFnA();
IntFunPtr CreateTemplateClassTemplateInlineMemberFnA();

IntFunPtr CreateTemplateNonMemberFnB();
IntFunPtr CreateClassTemplateMemberFnB();
IntFunPtr CreateClassTemplateInlineMemberFnB();
IntFunPtr CreateTemplateClassMemberFnB();
IntFunPtr CreateTemplateClassInlineMemberFnB();
IntFunPtr CreateTemplateClassTemplateMemberFnB();
IntFunPtr CreateTemplateClassTemplateInlineMemberFnB();

#endif // !defined(TESTCLASS_H)